<?php

class ExpensesController extends AppController {

    var $name = 'Expenses';
    var $uses = array('Expense', 'Cash', 'CashMovement');

    function index($date_from = null, $date_to = null) {
        if ($date_from != null) {
            $this->data['Expense']['date_from'] = date('d/m/Y', strtotime($date_from));
            $this->data['Expense']['date_to'] = date('d/m/Y', strtotime($date_to));
        }

        $fecha_min = '';
        $fecha_max = '';
        $filtro = '1 = 1';
        //si vienen filtros aplicados
        if (!empty($this->data)) {

            $datos = $this->data['Expense'];

            if (isset($datos['expensetype_id']) && trim($datos['expensetype_id']) != '') {
                $filtro .= ' AND Expense.expensetype_id = ' . $datos['expensetype_id'];
            }
            if (isset($datos['employee_id']) && trim($datos['employee_id']) != '') {
                $filtro .= ' AND Expense.employee_id = ' . $datos['employee_id'];
            }
            if (isset($datos['date_from']) && trim($datos['date_from']) != '') {
                list($d, $m, $a) = explode("/", $datos['date_from']);
                $fecha_from = $a . "-" . $m . "-" . $d . ' 00:00:00';
                $filtro .= ' AND Expense.date >= "' . $fecha_from . '"';
                $datos['date_from'] = $fecha_from;
                $fecha_min = 'si';
            }
            if (isset($datos['date_to']) && trim($datos['date_to']) != '') {
                list($d, $m, $a) = explode("/", $datos['date_to']);
                $fecha_to = $a . "-" . $m . "-" . $d . ' 23:59:59';
                $filtro .= ' AND Expense.date <= "' . $fecha_to . '"';
                $datos['date_to'] = $fecha_to;
                $fecha_max = 'si';
            }
            if (isset($datos['created_from']) && trim($datos['created_from']) != '') {
                list($d, $m, $a) = explode("/", $datos['created_from']);
                $created_from = $a . "-" . $m . "-" . $d . ' 00:00:00';
                $filtro .= ' AND Expense.created >= "' . $created_from . '"';
                $datos['created_from'] = $created_from;
            }
            if (isset($datos['created_to']) && trim($datos['created_to']) != '') {
                list($d, $m, $a) = explode("/", $datos['created_to']);
                $created_to = $a . "-" . $m . "-" . $d . ' 23:59:59';
                $filtro .= ' AND Expense.created <= "' . $created_to . '"';
                $datos['created_to'] = $created_to;
            }

            $restricciones['Expense'] = $filtro;
            $restricciones['data'] = $this->data;
            $this->Session->write('search_conditions_expenses', $restricciones);
        } elseif ($this->Session->check('search_conditions_expenses')) {

            $restricciones = $this->Session->read('search_conditions_expenses');
            $filtro = $restricciones['Expense'];
            $this->data = $restricciones['data'];
            $datos = $this->data['Expense'];

            if (isset($datos['date_from']) && trim($datos['date_from']) != '') {
                $fecha_min = 'si';
            }
            if (isset($datos['date_to']) && trim($datos['date_to']) != '') {
                $fecha_max = 'si';
            }
        }

        //si no viene ningun filtro de fecha, le pongo lo de la ultima semana
        if ($fecha_min != 'si' && $fecha_max != 'si' ) {
            $aux_fecha_min = date('Y-m-d 00:00:00', strtotime('-15day', strtotime(date('Y-m-d H:i:s'))));
            $aux_fecha_max = date('Y-m-d 23:59:59', strtotime('+15day', strtotime(date('Y-m-d H:i:s'))));

            $filtro .= ' AND Expense.date >= "' . $aux_fecha_min . '"';

            $filtro .= ' AND Expense.date <= "' . $aux_fecha_max . '"';

            $this->data['Expense']['date_from'] = date('d/m/Y', strtotime($aux_fecha_min));
            $this->data['Expense']['date_to'] = date('d/m/Y', strtotime($aux_fecha_max));
        }

        $expenses = $this->Expense->find('all', array(
            'recursive' => 0,
            'conditions' => array(
                $filtro
            )
                ));

        //traigo los tipos de gastos
        $expensetypes = $this->Expense->Expensetype->find('list');
        $expensetypes = array(null => 'Seleccione') + $expensetypes;

        $employees[null] = 'Todos';
        $employees = $employees + $this->Expense->Employee->getListName();

        $this->set(compact('expenses', 'expensetypes', 'employees'));
    }

    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Gasto Extra Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->set('expense', $this->Expense->read(null, $id));
    }

    function add() {
        if (!empty($this->data)) {

            $pagar_caja = 0;
            if ($this->data['Expense']['con_caja'] == 1 || $this->Auth->user('group_id') == GROUP_USER) {
                //entonces vamos a registrar este movimiento en la caja actual
                //primero controlamos que alcance el monto

                $monto_pagar = $this->data['Expense']['value'];

                //controlo que haya suficiente dinero en la caja
                if (!$this->Cash->controlarPago($monto_pagar)) {
                    //si no alcanza el dinero de la caja para pagar 
                    //redirecciono al lugar desde donde fue llamado
                    $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                    $this->redirect($this->referer());
                }

                $pagar_caja = 1;
                //si lo carga con la caja lo marcamos como ya pagado
                $this->data['Expense']['paid'] = 1;
            }

            $fecha_vieja = $this->data['Expense']['date'];
            list($d, $m, $a) = explode("/", $this->data['Expense']['date']);
            $fecha_nueva = $a . "-" . $m . "-" . $d;
            $this->data['Expense']['date'] = $fecha_nueva;
            $this->Expense->create();
            if ($this->Expense->save($this->data)) {
                $expense_id = $this->Expense->id;

                $this->Session->setFlash(__('El Gasto Extra ha sido creado', true));

                if ($pagar_caja == 1) {

                    //ahora cargamos el movimiento
                    $array_mov = array();
                    $array_mov['user_id'] = $this->Auth->user('id');
                    $array_mov['type'] = 'out';
                    if ($this->data['Expense']['employee_id']) {
                        $array_mov['movement'] = 'employee';
                    } else {
                        $array_mov['movement'] = 'expense';
                    }
                    $array_mov['amount'] = $monto_pagar;
                    $array_mov['expense_id'] = $expense_id;
                    $array_mov['employee_id'] = $this->data['Expense']['employee_id'];

                    //guardamos el movimiento
                    $this->CashMovement->create();
                    $this->CashMovement->save($array_mov);
                }

                //ahora redirijimos
                if ($this->referer() == '/stats/employee') {
                    $this->redirect($this->referer());
                }
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El Gasto Extra no ha sido creado. Por favor, intente nuevamente.', true));
                $this->data['Expense']['date'] = $fecha_vieja;
            }
        }
        //traigo los tipos de gastos
        $expensetypes = $this->Expense->Expensetype->find('list');
        $expensetypes = array(null => 'Seleccione') + $expensetypes;

        $employees[null] = 'Ninguno';
        $employees = $employees + $this->Expense->Employee->getListName();

        $this->set(compact('expensetypes', 'employees'));
    }

    function edit($id = null) {
        if (!$id && empty($this->data)) {
            $this->Session->setFlash(__('Gasto Extra Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        if (!empty($this->data)) {
            $fecha_vieja = $this->data['Expense']['date'];
            list($d, $m, $a) = explode("/", $this->data['Expense']['date']);
            $fecha_nueva = $a . "-" . $m . "-" . $d;
            $this->data['Expense']['date'] = date('Y-m-d', strtotime($fecha_nueva));
            if ($this->Expense->save($this->data)) {
                $this->Session->setFlash(__('El Gasto Extra ha sido editado', true));
                $this->redirect(array('action' => 'index'));
            } else {
                $this->Session->setFlash(__('El Gasto Extra no ha sido editado. Por favor, intente nuevamente.', true));
                $this->data['Expense']['date'] = $fecha_vieja;
            }
        }
        if (empty($this->data)) {
            $this->data = $this->Expense->read(null, $id);
            $this->data['Expense']['date'] = date('d/m/Y', strtotime($this->data['Expense']['date']));
        }
        //traigo los tipos de gastos
        $expensetypes = $this->Expense->Expensetype->find('list');
        $expensetypes = array(null => 'Seleccione') + $expensetypes;

        $employees[null] = 'Ninguno';
        $employees = $employees + $this->Expense->Employee->getListName();

        $this->set(compact('expensetypes', 'employees'));
    }

    function delete($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Gasto Extra Inexistente', true));
            $this->redirect(array('action' => 'index'));
        }
        if ($this->Expense->delete($id)) {
            $this->Session->setFlash(__('El Gasto Extra ha sido eliminado', true));
            $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('El Gasto Extra ha sido eliminado. Por favor, intente nuevamente.', true));
        $this->redirect(array('action' => 'index'));
    }

    /**
     * Función que se utiliza para pagar un determinado gasto extra
     * @param type $expense_id
     * @param int $pagar_caja si es 1 indica que se debe pagar con la caja
     */
    function pay($expense_id, $pagar_caja = NULL) {

        //si es un usuario común, solo puede pagar con caja
        if ($this->Auth->user('group_id') == GROUP_USER) {
            $pagar_caja = 1;
        }

        //si tiene que pagar con la caja, registramos este movimiento
        if ($pagar_caja) {

            //busco el monto a registrar
            $expense = $this->Expense->find('first', array(
                'recursive' => -1,
                'conditions' => array(
                    'Expense.id' => $expense_id,
                    'Expense.paid' => 0
                )
                    ));


            if (empty($expense)) {
                //si no encuentra nada es porque hizo alguna cagada con la url
                $this->Session->setFlash(__('Operación inválida', true));
                $this->redirect($this->referer());
            }

            $monto_pagar = $expense['Expense']['value'];

            //controlo que haya suficiente dinero en la caja
            if (!$this->Cash->controlarPago($monto_pagar)) {
                //si no alcanza el dinero de la caja para pagar 
                //redirecciono al lugar desde donde fue llamado
                $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                $this->redirect($this->referer());
            }

            $array_mov = array();
            $array_mov['user_id'] = $this->Auth->user('id');
            $array_mov['type'] = 'out';
            if ($expense['Expense']['employee_id']) {
                $array_mov['movement'] = 'employee';
            } else {
                $array_mov['movement'] = 'expense';
            }
            $array_mov['amount'] = $monto_pagar;
            $array_mov['expense_id'] = $expense_id;
            $array_mov['employee_id'] = $expense['Expense']['employee_id'];

            //guardamos el movimiento
            $this->CashMovement->create();
            $this->CashMovement->save($array_mov);
        }

        $this->Expense->id = $expense_id;
        if ($this->Expense->saveField('paid', 1)) {
            $this->Session->setFlash(__('El Gasto Extra ha sido pagado', true));
        } else {
            $this->Session->setFlash(__('El Gasto Extra ha sido pagado. Por favor, intente nuevamente.', true));
        }
        //redirecciono al lugar desde donde fue llamado
        $this->redirect($this->referer());
    }

    /**
     * Función para pagar todos los gastos de un empleado en un determinado
     * rango de fechas.
     * Se lo utiliza desde la estadística de empleado
     * @param type $employee_id
     * @param type $date_from
     * @param type $date_to
     * @param int $pagar_caja si es 1 indica que se debe pagar con la caja
     */
    function pay_all($employee_id, $date_from, $date_to, $pagar_caja = NULL) {

        //si es un usuario común, solo puede pagar con caja
        if ($this->Auth->user('group_id') == GROUP_USER) {
            $pagar_caja = 1;
        }

        //si tiene que pagar con la caja, registramos este movimiento
        if ($pagar_caja) {
            $sql = 'SELECT SUM(value) as total
                FROM expenses as Expense
                WHERE paid = 0
                AND Expense.employee_id = ' . $employee_id . '
                AND Expense.date >= "' . $date_from . '"
                AND Expense.date <= "' . $date_to . '"';

            $res = $this->Expense->query($sql);

            if (empty($res)) {
                //si no encuentra nada es porque hizo alguna cagada con la url
                $this->Session->setFlash(__('Operación inválida', true));
                $this->redirect($this->referer());
            }

            //controlo que haya suficiente dinero en la caja
            if (!$this->Cash->controlarPago($res[0][0]['total'])) {
                //si no alcanza el dinero de la caja para pagar 
                //redirecciono al lugar desde donde fue llamado
                $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                $this->redirect($this->referer());
            }
        }

        if ($this->Expense->payAll($employee_id, $date_from, $date_to, $pagar_caja)) {
            $this->Session->setFlash(__('El Pago de todos los Gastos ha sido registrado', true));
        } else {
            $this->Session->setFlash(__('El Pago de todos los Gastos no ha sido registrado. Por favor, intente nuevamente.', true));
        }
        //redirecciono al lugar desde donde fue llamado
        $this->redirect($this->referer());
    }

    /**
     * Función para pagar todo lo que se encuentre dentro del filtro de gastos
     * O sea, se paga todo lo que se esta mostrando
     */
    function pay_filter($pagar_caja = NULL) {
        //voy a marcar como pagados todos aquellos gastos que esten dentro del filtro
        //aplicado que esta guardado en la sesion
        if ($this->Session->check('search_conditions_expenses')) {

            $restricciones = $this->Session->read('search_conditions_expenses');
            $filtro = $restricciones['Expense'];

            if ($pagar_caja) {
                //vamos a ver si me alcanza el dinero de la caja para poder pagar
                $sql = 'SELECT SUM(value) as total
                FROM expenses as Expense
                WHERE ' . $filtro . ' AND paid = 0';

                $res = $this->Expense->query($sql);

                if (empty($res)) {
                    //si no encuentra nada es porque hizo alguna cagada con la url
                    $this->Session->setFlash(__('Operación inválida', true));
                    $this->redirect($this->referer());
                }

                //controlo que haya suficiente dinero en la caja
                if (!$this->Cash->controlarPago($res[0][0]['total'])) {
                    //si no alcanza el dinero de la caja para pagar 
                    //redirecciono al lugar desde donde fue llamado
                    $this->Session->setFlash(__('El dinero en la caja no es suficiente para realizar el pago', true));
                    $this->redirect($this->referer());
                }

                //si me alcanza el dinero, voy a registrar los movimientos
                $sql = 'SELECT *
                FROM expenses as Expense
                WHERE ' . $filtro . ' AND paid = 0';

                $expenses = $this->query($sql);

                foreach ($expenses as $expense) {
                    $array_mov = array();
                    $array_mov['user_id'] = $this->Auth->user('id');
                    $array_mov['type'] = 'out';
                    if ($expense['Expense']['employee_id']) {
                        $array_mov['movement'] = 'employee';
                    } else {
                        $array_mov['movement'] = 'expense';
                    }
                    $array_mov['amount'] = $expense['Expense']['value'];
                    $array_mov['expense_id'] = $expense['Expense']['id'];
                    $array_mov['employee_id'] = $expense['Expense']['employee_id'];

                    //guardamos el movimiento
                    $this->CashMovement->create();
                    $this->CashMovement->save($array_mov);
                }
            }

            if ($this->Expense->updateAll(array('Expense.paid' => 1), $filtro)) {
                $this->Session->setFlash(__('El Pago de todos los Gastos ha sido registrado', true));
            } else {
                $this->Session->setFlash(__('El Pago de todos los Gastos no ha sido registrado. Por favor, intente nuevamente.', true));
            }

            $this->redirect($this->referer());
        }
    }

}

